package fucai.com.fucai.blmanager;

import android.content.Context;
import android.os.Handler;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import fucai.com.fucai.Analyse.HostoryDataAnanlyse;
import fucai.com.fucai.R;
import fucai.com.fucai.db.DbHepler;
import fucai.com.fucai.db.FuCaiNumber;
import fucai.com.fucai.db.SixThereCom;
import fucai.com.fucai.task.AddTxtToxUtilsThread;
import fucai.com.fucai.task.CopyTxttoFileThread;
import fucai.com.fucai.ui.NiuFuCai;
import fucai.com.fucai.utils.AnalyseUtils;
import fucai.com.fucai.utils.LinkUtils;

/**
 * @说 明：数据库的管理
 * @项目名称：fucai
 * @包 名： fucai.com.fucai
 * @类 名： Fucai
 * @创 建人： chenshuangniu
 * @创建时间：2015/12/9 21:26
 * @版 本：v1.0
 * @修 改人：
 * @修改时间：
 * @修改备注：
 */

public class DataManager extends BaseBLManager {
    private List<FuCaiNumber> list = new ArrayList<>();
    private HostoryDataAnanlyse ananlyse = null;
    private Set<String> fristForcast = new HashSet<>();
    private List<SixThereCom> sixThereComs;
    private List<SixThereCom> sixComs;
    private List<SixThereCom> thereComs;

    /**
     * Initialize adapter
     *
     * @param context
     */
    public DataManager(Context context) {
        super(context);
    }

    /**
     * 把txt转换为集合 是否成功
     *
     * @return
     */
    public boolean addTextToList(List<FuCaiNumber> fuCaiNumber, Context context) {
        return LinkUtils.txtToList(fuCaiNumber, new File(context.getFilesDir(), "multiple.txt"));
    }

    public boolean addTextToListSix(List<SixThereCom> fuCaiNumber, Context context) {
        return LinkUtils.txtToListThereSix(fuCaiNumber, new File(context.getFilesDir(), "lix_com.txt"));
    }


    /**
     * 把集合存入数据库
     * 这里因为fucainumber有一部分的数据来源网络  所有需要判断
     * 这样在加载网络数据是就不会加载组六组三数据
     *
     * @param fuCaiNumber
     * @return
     */
    public void addListToDB(List<FuCaiNumber> fuCaiNumber, List<SixThereCom> six) {
        if (!fuCaiNumber.isEmpty())
            DbHepler.getInstance().addFucaiNumberList(fuCaiNumber);
        if (!six.isEmpty())
            DbHepler.getInstance().addSixThereComList(six);
    }

    public List<FuCaiNumber> findAll() {
        return DbHepler.getInstance().findAll();
    }

    public List<FuCaiNumber> findLime(int limt) {
        return DbHepler.getInstance().findLimt(limt);
    }

    /**
     * 复制文件到系统  这里要注意 资源文件的应用  raw
     *
     * @return
     */
    public void copyTxtToDb(Handler handler, final Context context) {
        new CopyTxttoFileThread(context, handler, "multiple.txt", R.raw.multiple).start();
        new CopyTxttoFileThread(context, handler, "lix_com.txt", R.raw.lix_com).start(); //组六组三组选
    }

    public void copyDataToDb(Handler handler, final Context context) {
        List<FuCaiNumber> fuCaiNumbers = new ArrayList<>();
        List<SixThereCom> six = new ArrayList<>();
        boolean isAdd = addTextToList(fuCaiNumbers, context);
        boolean isSix = addTextToListSix(six, context);
        if (isAdd && isSix) {
            new AddTxtToxUtilsThread(context, handler, fuCaiNumbers, six).start();
        } else {
            handler.sendMessage(handler.obtainMessage(NiuFuCai.COPY_IS_FAILE_LIST));
        }
    }

    /**
     * 设置数据 得到需要的数据
     * 注意初始化
     *
     * @param limt
     */
    public void setAnlyseCard(int limt) {
        list = DbHepler.getInstance().findLimt(limt);
        ananlyse = new HostoryDataAnanlyse(list);
        ananlyse.getHistoryData();
    }

    /**
     * 得到开奖号统计结果
     *
     * @return
     */
    public int[][] getAnlyseOpen() {
        return ananlyse.getCuOpenup();
    }

    /**
     * 得到试机号统计结果
     *
     * @return
     */
    public int[][] getAnlyseTest() {
        return ananlyse.getCuTest();
    }

    /**
     * 得到上一期试机号统计结果
     *
     * @return
     */
    public int[][] getAnlyseTestUp() {
        return ananlyse.getCuTestup();
    }

    /**
     * 得到开奖号统计的对应的最高号码
     *
     * @return
     */
    public String getAnlyseOpenMax(String max) {
        return AnalyseUtils.getAnalyseOpenMax(getAnlyseOpen(), max);
    }

    /**
     * 得到当期试机号统计的对应的最高号码
     *
     * @return
     */
    public String getAnlyseTestMax(String max) {
        return AnalyseUtils.getAnalyseOpenMax(getAnlyseTest(), max);
    }

    /**
     * 得到上一期试机号统计的对应的最高号码
     *
     * @return
     */
    public String getAnlyseTestUpMax(String max) {
        return AnalyseUtils.getAnalyseOpenMax(getAnlyseTestUp(), max);
    }

    /**
     * 第一次预测
     *
     * @param info
     * @return
     */
    public String getFristForecast(String[] info) {
        String count =
                getAnlyseOpenMax(info[0]) + getAnlyseOpenMax(info[1]) + getAnlyseOpenMax(info[2]) +
                        getAnlyseTestUpMax(info[3]) + getAnlyseTestUpMax(info[4]) + getAnlyseTestUpMax(info[5]) +
                        getAnlyseTestMax(info[6]) + getAnlyseTestMax(info[7]) + getAnlyseTestMax(info[8]);
        int[] countFrist = AnalyseUtils.getFristForecastCount(count);
        AnalyseUtils.createSetData(fristForcast, countFrist);
        String reslut = "";
        for (String s : fristForcast) {
            reslut += (s + "  ");
        }

        return reslut;
    }

    /**
     * 得到全部的组三组六 同时放开放入集合 一定要
     */
    public void getSixThereComs() {
        sixThereComs = new ArrayList<>();
        sixThereComs = DbHepler.getInstance().findAllSixThereComs();
        sixComs = new ArrayList<>();
        thereComs = new ArrayList<>();
        for (int i = 0; i < sixThereComs.size(); i++) {
            SixThereCom st = sixThereComs.get(i);
            if (i < 120) {
                sixComs.add(st);
            } else {
                thereComs.add(st);
            }
        }
    }

    /**
     * 得到组六的组选大底
     *
     * @return
     */
    public List<SixThereCom> getSixComs() {
        getSixThereComs();
        return sixComs;
    }

    /**
     * 得到组三的组选大底
     *
     * @return
     */
    public List<SixThereCom> getThereComs() {
        getSixThereComs();
        return thereComs;
    }

    /**
     * 关闭所有的数据库
     */
    public void colseAllDb() {
        DbHepler.getInstance().closeDb();
    }
}
